package business;

import java.util.ArrayList;
import java.util.Iterator;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.SEE;
import persistence.model.TypeEnseignement;
import utility.Record;

public class TypeEnseignementBL {

	private TypeEnseignement te = null;
	ArrayList<String> listeErreurs = null;
	
	public TypeEnseignementBL() {

	}

	public TypeEnseignementBL(int id) {
		te = (TypeEnseignement) TypeEnseignement.all().get(id);
	}
	
	/**
	 * @return si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(){
		boolean estValide = true;
		boolean existeDeja = false;
		for (AbstractModel typeEns : TypeEnseignement.all())
		{
			TypeEnseignement teCourant = (TypeEnseignement)typeEns;
			if (teCourant.getNomTypeEnseignement().equals(te.getNomTypeEnseignement())) {
				estValide = false;
				existeDeja = true;
			}
		}
		if (existeDeja) {
			listeErreurs.add("Ce type d'enseignement existe déjà.");
		}
		if (te.getNombreHeuresEquivalentTD()< 0 || te.getNombreHeuresEquivalentTD()> 10 ) {
			listeErreurs.add("Le nombre d'heure équivalent TD doit être compris entre 0 et 10");
			estValide = false;
		}
		if (te.getNomTypeEnseignement().length() > 20) {
			listeErreurs.add("Le nom est trop long.");
			estValide = false;
		}
		System.out.println(listeErreurs);
		return estValide;
	}

	/**
	 * @return si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		boolean estValide = true;
		/* Ensemble des see du type d'enseignement en cours*/
		DataSet seeset = SEE.all().filter("fk_SEE_TYPE_ENSEIGNEMENT = "+te.getId());
		Iterator<AbstractModel> it = seeset.iterator();
		if (it.hasNext()) {
			/* il existe un see concernant ce type d'enseignement */
			listeErreurs.add("Il y a au moins un SEE qui correspond à ce type d'enseignement.");
			estValide = false;
		}
		return estValide;
	}
	
	/**
	 * Permet l'ajout d'un type d'enseignement
	 * @param id : identifiant du type d'enseignement
	 * @param nom : nom du type d'enseignement
	 * @param nombreHeureEqTD : nombre d'heure equivalent TD
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> ajouterTypeEnseignement(int id, String nom, float nombreHeureEqTD) {
		listeErreurs = new ArrayList<String>();
		te = new TypeEnseignement(id, nom, nombreHeureEqTD);
		if (this.estValidePourModif()) {
			te.save();
		}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	
	/**
	 * @param id : identifiant du type d'enseignement
	 * @param nom : nom du type d'enseignement
	 * @param nombreHeureEqTD : nombre d'heure equivalent TD
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> modifierTypeEnseignement(int id, String nom, float nombreHeureEqTD) {
		listeErreurs = new ArrayList<String>();
		te = new TypeEnseignement(id, nom, nombreHeureEqTD);
		if (this.estValidePourModif()) {
			te.save(id);
		}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	
	/**
	 * Permet la suppression d'un type d'enseignement
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> supprimerTypeEnseignement() {
		listeErreurs = new ArrayList<String>();
		if (this.estValidePourSuppr()) {
			te.delete();
		}
		return listeErreurs;
	}
	
	/* Ensemble des getters et setters -> delegation vers la persistance */
		
	public int getIdTypeEnseignement() {
		return te.getId();
	}

	public void setIdTypeEnseignement(int idTypeEnseignement) {
		te.setId(idTypeEnseignement);
	}

	public String getNomTypeEnseignement() {
		return te.getNomTypeEnseignement();
	}

	public void setNomTypeEnseignement(String nomTypeEnseignement) {
		te.setNomTypeEnseignement(nomTypeEnseignement);
	}

	public float getNombreHeuresEquivalentTD() {
		return te.getNombreHeuresEquivalentTD();
	}

	public void setNombreHeuresEquivalentTD(float nombreHeuresEquivalentTD) {
		te.setNombreHeuresEquivalentTD(nombreHeuresEquivalentTD);
	}
	
	/**
	 * @return une liste de record
	 * chaque record comprenant le nom du type d'enseignement ainsi que son id
	 */
	public ArrayList<Record> getListeTypeEnseignement()
	{
		ArrayList<Record> listeTypeEnseignement = new ArrayList<Record>();
		for (AbstractModel te : TypeEnseignement.all())
		{
			TypeEnseignement typeCourant = (TypeEnseignement)te;
			
			int idTypeEnseignement = typeCourant.getId();
			String nomTypeEnseignement = typeCourant.getNomTypeEnseignement();
			
			listeTypeEnseignement.add(new Record(idTypeEnseignement, nomTypeEnseignement));
		}
		
		return listeTypeEnseignement;
	}
}
